Data Source

  • These data come from the FCC's data on broadband availability.
  • FCC data is released biannually on a year and half delay from when it was collected. New data can be downloaded from this link.
  • Data presented here are from June of 2020.

Data specifics

  • All internet providers must submit form 477 to the FCC biannually detailing the Maximum download and upload speeds (Mbps) they advertise to consumers along with other information about the company.
  • The FCC makes these data publicly available on a year and a half delay from when all 477 forms are submitted.
    • Limitations: (1) The data are available at the census block level, but are likely to overstate coverage because if an internet provider provides internet to a single person in a census block, the entire census block is marked as having coverage by that provider.
    • Strengths: (1) These are the same data used by the government to make policy decisions regarding broadband access. (2) Trump signed an act into law in March of 2020 that is supposed to improve the limitation listed above.

Variable descriptions

meta %>% 
  filter(su_blkgp == 1) %>%
  select(varname, about) %>% as.list()
## $varname
## [1] "Blkgr"           "consproviders"   "busproviders"    "avgMaxAdDown"   
## [5] "avgMaxAdUp"      "p_under25.3mbps"
## 
## $about
## [1] "12-digit block group code"                                                                                                                                                                        
## [2] "The number of consumer internet providers in the su"                                                                                                                                              
## [3] "The number of business internet providers in the su"                                                                                                                                              
## [4] "The average maximum advertised download speed by each broadband provider in the su"                                                                                                               
## [5] "The average maxmum advertised upload speed by each broadband provider in the su"                                                                                                                  
## [6] "The proportion of census blocks within the block group/tract that have internet speeds under 25/3 Mbps, and therefore don't meet the FCC benchmark for \"advanced telecommunications capability\""
glimpse(eastdat)
## Rows: 46
## Columns: 6
## $ Blkgr           <dbl> 510010901001, 510010901002, 510010901003, 510010901004…
## $ consproviders   <int> 9, 8, 8, 9, 8, 8, 9, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 3, …
## $ busproviders    <int> 12, 10, 10, 10, 10, 12, 11, 8, 10, 9, 9, 8, 8, 11, 8, …
## $ avgMaxAdDown    <dbl> 254.02058, 334.36508, 307.09728, 302.38507, 144.08415,…
## $ avgMaxAdUp      <dbl> 116.736048, 212.879725, 162.567611, 156.365369, 91.729…
## $ p_under25.3mbps <dbl> 0.086021505, 0.000000000, 0.025000000, 0.012269939, 0.…
eastdat %>% select(consproviders, busproviders, avgMaxAdDown, avgMaxAdUp, p_under25.3mbps) %>% 
  select(where(~is.numeric(.x))) %>% 
  as.data.frame() %>% 
  stargazer(., type = "text", title = "Summary Statistics", digits = 2,
            summary.stat = c("mean", "sd", "min", "median", "max"))
## 
## Summary Statistics
## ===================================================
## Statistic        Mean  St. Dev.  Min  Median  Max  
## ---------------------------------------------------
## consproviders    7.00    1.59     1     7      9   
## busproviders     8.74    2.19     1     9      12  
## avgMaxAdDown    247.38  93.12   42.93 267.95 439.10
## avgMaxAdUp      148.93  77.75   2.02  162.83 362.74
## p_under25.3mbps  0.08    0.14   0.00   0.00   0.56 
## ---------------------------------------------------

Visual distribution

eastdat %>% select(c(Blkgr, consproviders, busproviders, avgMaxAdDown, avgMaxAdUp, p_under25.3mbps)) %>% 
  pivot_longer(-Blkgr, names_to = "measure", values_to = "value") %>%
  ggplot(aes(x = value, fill = measure)) +
  scale_fill_viridis(option = "plasma", discrete = TRUE, guide = FALSE) +
  geom_histogram() + 
  facet_wrap(~measure, scales = "free")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

meta %>% 
  filter(varname %in% c("consproviders", "busproviders", "avgMaxAdDown", "avgMaxAdUp", "p_under25.3mbps")) %>%
  mutate(label = paste0(varname, ": ", about)) %>% 
  select(label) %>% 
  as.list()

$label [1] "consproviders: The number of consumer internet providers in the su"
[2] "busproviders: The number of business internet providers in the su"
[3] "avgMaxAdDown: The average maximum advertised download speed by each broadband provider in the su"
[4] "avgMaxAdUp: The average maxmum advertised upload speed by each broadband provider in the su"
[5] "p_under25.3mbps: The proportion of census blocks within the block group/tract that have internet speeds under 25/3 Mbps, and therefore don't meet the FCC benchmark for "advanced telecommunications capability""

Mapping the data

Number of consumer internet providers

pal <- colorNumeric("plasma", reverse = TRUE, domain = mapdat$consproviders)

leaflet() %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = mapdat,
              fillColor = ~pal(consproviders),
              weight = 1,
              opacity = 1,
              color = "white", 
              fillOpacity = 0.6,
              highlight = highlightOptions(
                weight = 2,
                fillOpacity = 0.8,
                bringToFront = T
              ),
              popup = paste0("GEOID: ", mapdat$Blkgr, "<br>",
                             "Number of internet providers: ", mapdat$consproviders)
  ) %>% 
  addLegend("bottomright", pal = pal, values = mapdat$consproviders, 
            title = "Number of internet <br> providers per block group", opacity = 0.7)

Average maximum advertised download speeds

pal <- colorNumeric("plasma", reverse = TRUE, domain = mapdat$avgMaxAdDown) 

leaflet() %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = mapdat,
              fillColor = ~pal(avgMaxAdDown),
              weight = 1,
              opacity = 1,
              color = "white", 
              fillOpacity = 0.6,
              highlight = highlightOptions(
                weight = 2,
                fillOpacity = 0.8,
                bringToFront = T
              ),
              popup = paste0("GEOID: ", mapdat$Blkgr, "<br>",
                             "Average max advertised <br> download speeds: ", round(mapdat$avgMaxAdDown, 2))
  ) %>% 
  addLegend("bottomright", pal = pal, values = mapdat$avgMaxAdDown, 
            title = "Average maximum <br> advertised download <br> speeds per block group", opacity = 0.7)

Average maximum advertised upload speeds

pal <- colorNumeric("plasma", reverse = TRUE, domain = mapdat$avgMaxAdUp)

leaflet() %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = mapdat,
              fillColor = ~pal(avgMaxAdUp),
              weight = 1,
              opacity = 1,
              color = "white", 
              fillOpacity = 0.6,
              highlight = highlightOptions(
                weight = 2,
                fillOpacity = 0.8,
                bringToFront = T
              ),
              popup = paste0("GEOID: ", mapdat$Blkgr, "<br>",
                             "Average max <br> advertised upload speeds: ", round(mapdat$avgMaxAdUp, 2))
  ) %>% 
  addLegend("bottomright", pal = pal, values = mapdat$avgMaxAdUp, 
            title = "Average maximum <br> advertised <br> upload speeds per block group", opacity = 0.7)

Percent of blocks that don't meet the FCC threshold for "advanced telecommunications capability"

  • Percent of blocks in the spatial unit that do not meet the 25/3 Mbps bandwidth based on their providers' average maximum advertised download and upload speeds
pal <- colorNumeric("plasma", reverse = TRUE, domain = (mapdat$p_under25.3mbps *100))

leaflet() %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = mapdat,
              fillColor = ~pal((mapdat$p_under25.3mbps *100)),
              weight = 1,
              opacity = 1,
              color = "white", 
              fillOpacity = 0.6,
              highlight = highlightOptions(
                weight = 2,
                fillOpacity = 0.8,
                bringToFront = T
              ),
              popup = paste0("GEOID: ", mapdat$Blkgr, "<br>",
                             "Percent of blocks  <br>without advanced  <br>telecommunications capability: ", round((mapdat$p_under25.3mbps *100), 2))
  ) %>% 
  addLegend("bottomright", pal = pal, values = (mapdat$p_under25.3mbps *100), 
            title = "Percent of blocks  <br>without advanced  <br>telecommunications capability", opacity = 0.7)